www.gusucode.com > VC 模范QQ做的一个界面-源码程序 > VC 模范QQ做的一个界面-源码程序/code/MyQQ/TabCtrlST.cpp
//Download by http://www.NewXing.com // TabCtrlST.cpp : implementation file // #include "stdafx.h" #include "MyQQ.h" #include "TabCtrlST.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTabCtrlST CTabCtrlST::CTabCtrlST() { m_pMainPanel = new CMainPanel; m_bShowTab = TRUE; m_nTabWidth= 28; m_nMouseOn = 0; m_nCurrent = 0; //设置三个标签的矩形区域 m_TabRect[0] = CRect(0, 25, 28, 25+TAB_SPACE); m_TabRect[1] = CRect(0, 25+TAB_SPACE, 28, 25+TAB_SPACE*2); m_TabRect[2] = CRect(0, 25+TAB_SPACE*2, 28, 25+TAB_SPACE*3); } CTabCtrlST::~CTabCtrlST() { delete m_pMainPanel; } BEGIN_MESSAGE_MAP(CTabCtrlST, CTabCtrl) //{{AFX_MSG_MAP(CTabCtrlST) ON_WM_CREATE() ON_WM_MOUSEMOVE() ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_SIZE() ON_WM_NCPAINT() ON_WM_MOVING() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTabCtrlST message handlers BOOL CTabCtrlST::DrawTabButton(CDC *pDC) { CRect rc; GetClientRect(&rc); CDC memDC; CBitmap& bmpTabBk = m_pSkin->TbBkBmp; BITMAP bm; bmpTabBk.GetBitmap(&bm); int cx = bm.bmWidth; int cy = bm.bmHeight; //画标签栏背景 memDC.CreateCompatibleDC(pDC); CBitmap* OldBitmap = memDC.SelectObject(&bmpTabBk); pDC->StretchBlt(0,3,28,rc.Height()-6,&memDC,0,0,cx,cy,SRCCOPY); memDC.SelectObject(OldBitmap); memDC.DeleteDC(); CBitmap& TabBmp1_disable= m_pSkin->TbBkBmp1_disable; CBitmap& TabBmp1_normal = m_pSkin->TbBkBmp1_normal; CBitmap& TabBmp2_normal = m_pSkin->TbBkBmp2_normal; CBitmap& TabBmp1_hover = m_pSkin->TbBkBmp1_hover; CBitmap& TabBmp2_hover = m_pSkin->TbBkBmp2_hover; //画每个标签图标的背景 COLORREF clrMaskColor = RGB(255,0,255); //用于做透明色 //第一个图标背景 m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[0].left, m_TabRect[0].top), TabBmp1_normal, CPoint(0,0), CSize(m_TabRect[0].Width(), m_TabRect[0].Height()), clrMaskColor); //第二个图标背景 m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[1].left, m_TabRect[1].top), TabBmp2_normal, CPoint(0,0), CSize(m_TabRect[1].Width(), m_TabRect[1].Height()), clrMaskColor); //第三个图标背景 m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[2].left, m_TabRect[2].top), TabBmp2_normal, CPoint(0,0), CSize(m_TabRect[2].Width(), m_TabRect[2].Height()), clrMaskColor); //画鼠标停留其上时的图标背景 if((m_nMouseOn > -1) && (m_nMouseOn!=m_nCurrent)) { switch(m_nMouseOn) { case 0: m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nMouseOn].left, m_TabRect[m_nMouseOn].top), TabBmp1_hover, CPoint(0,0), CSize(m_TabRect[m_nMouseOn].Width(), m_TabRect[m_nMouseOn].Height()), clrMaskColor); break; case 1: case 2: m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nMouseOn].left, m_TabRect[m_nMouseOn].top), TabBmp2_hover, CPoint(0,0), CSize(m_TabRect[m_nMouseOn].Width(), m_TabRect[m_nMouseOn].Height()), clrMaskColor); break; } } //画当前选中标签的图标背景 m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nCurrent].left, m_TabRect[m_nCurrent].top), TabBmp1_disable, CPoint(0,0), CSize(m_TabRect[m_nCurrent].Width(), m_TabRect[m_nCurrent].Height()), clrMaskColor); //画标签的图标 pDC->DrawIcon(m_TabRect[0].left+1, m_TabRect[0].top, m_pSkin->m_hIconQQ); pDC->DrawIcon(m_TabRect[1].left+1, m_TabRect[1].top, m_pSkin->m_hIconMsc); pDC->DrawIcon(m_TabRect[2].left+1, m_TabRect[2].top, m_pSkin->m_hIconDsk); return TRUE; } void CTabCtrlST::DrawBackGround(CDC *pDC, CRect &rc) { pDC->FillSolidRect(rc, m_pSkin->MainBk); } void CTabCtrlST::DrawAll(CDC *pDC) { CDC memDC; memDC.CreateCompatibleDC(pDC); CRect rc; GetClientRect(rc); CBitmap bm; bm.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height()); CBitmap *oldBitmap = memDC.SelectObject(&bm); DrawBackGround(&memDC,rc); memDC.FillSolidRect(CRect(m_nTabWidth, 3, rc.Width(), rc.Height()-3),RGB(255,255,255)); DrawCorner(&memDC); /* //画主边框 CPen MyPen; MyPen.CreatePen(PS_SOLID,5,m_pSkin->MainBorder); CPen *OldPen = memDC.SelectObject(&MyPen); memDC.MoveTo(0,0); memDC.LineTo(rc.right,0); memDC.LineTo(rc.right,rc.bottom); memDC.LineTo(0,rc.bottom); memDC.LineTo(0,0); memDC.SelectObject(OldPen); */ //画TAB标签 if( m_bShowTab ) { DrawTabButton(&memDC); } //显示 pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY); memDC.SelectObject(oldBitmap); DeleteObject(bm); memDC.DeleteDC(); } void CTabCtrlST::DrawCorner(CDC *pDC) { } int CTabCtrlST::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CTabCtrl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here //取应用程序的Skin对象 m_pSkin = &(((CMyQQApp *)AfxGetApp())->m_AppSkin); m_pMainPanel->Create(NULL,NULL,WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), this,1010); // m_pMainPanel->ShowWindow(SW_SHOW); return 0; } void CTabCtrlST::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default BOOL bPtInRt = FALSE; for(int i=0; i<3; i++) { if(m_TabRect[i].PtInRect(point)) { m_nMouseOn = i; bPtInRt = TRUE; break; } } if(!bPtInRt) { m_nMouseOn = -1; } UpdateTab(); CTabCtrl::OnMouseMove(nFlags, point); } void CTabCtrlST::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here DrawAll(&dc); // Do not call CTabCtrl::OnPaint() for painting messages } void CTabCtrlST::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default BOOL bPtInRt = FALSE; for(int i=0; i<3; i++) { if(m_TabRect[i].PtInRect(point)) { m_nCurrent = i; bPtInRt = TRUE; break; } } if(!bPtInRt) { m_nMouseOn = -1; } UpdateTab(); PageChanged(m_nCurrent); CTabCtrl::OnLButtonDown(nFlags, point); } void CTabCtrlST::UpdateTab() { CRect rc; GetClientRect(&rc); InvalidateRect(CRect(rc.left, rc.top, rc.left+m_nTabWidth, rc.bottom)); } void CTabCtrlST::OnSize(UINT nType, int cx, int cy) { CTabCtrl::OnSize(nType, cx, cy); // UpdateTab(); m_pMainPanel->MoveWindow(CRect(m_nTabWidth, 8, cx, cy-3),TRUE); // TODO: Add your message handler code here } void CTabCtrlST::OnNcPaint() { // TODO: Add your message handler code here /* CRect rcWin, rcClient; GetWindowRect(&rcWin); GetClientRect(&rcClient); CDC *pDC = this->GetWindowDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap& bmpleft = m_pSkin->sysleftlineBmp; CBitmap& bmpright = m_pSkin->sysrightlineBmp; BITMAP bm; bmpleft.GetBitmap(&bm); CBitmap* OldBitmap = memDC.SelectObject(&bmpleft); int y = 0; //画主窗口左边框 while(y < rc.Height()) { pDC->BitBlt(0,y,5,bm.bmHeight,&memDC,0,0,SRCCOPY); y+=bm.bmHeight; } //画右边框,位图高度与左边框的相同 memDC.SelectObject(&bmpright); y = 0; while(y < rc.Height()) { pDC->BitBlt(rc.right - 5, y, 5, bm.bmHeight,&memDC,0,0,SRCCOPY); y+=bm.bmHeight; } memDC.SelectObject(OldBitmap); memDC.DeleteDC(); */ // Do not call CTabCtrl::OnNcPaint() for painting messages } void CTabCtrlST::PageChanged(int NewPage) { m_pMainPanel->ShowWindow((NewPage==0)); } void CTabCtrlST::OnMoving(UINT fwSide, LPRECT pRect) { CTabCtrl::OnMoving(fwSide, pRect); // TODO: Add your message handler code here UpdateTab(); }